/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-06-07 15:26:45 +0000 (Thu, 07 Jun 2012) $
  Revision     : $Revision: 53 $
*******************************************/

package gui.login;

import static utilidad.Util.cadenaValida;
import gui.dialogo.DialogoMensaje;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.LayoutStyle;

import utilidad.IPropiedades;

import mensaje.Mensaje;

/**
 * Panel principal del dialogo de login.
 * <P>
 * Este panel, es incrustado en el dialogo 
 * de inicio de sesion. Contiene los 
 * componentes necesarios para ingresar al 
 * sistema.
 * 
 * @author jose.lara 07.06.2012
 */
public class LoginPanel extends JPanel {
    private static final long serialVersionUID = -1207410250904887506L;
    
    private LoginPanelControlador controlador   = null;
    private JLabel claveLabel                   = null;
    private JTextField usuarioTextField         = null;
    private JPasswordField clavePasswordField   = null;
    private JButton iniciarButton               = null;
    private JCheckBox guardarDatosCheckBox      = null;
    
    public LoginPanel() {
        super();
        JLabel usuarioLabel = new JLabel(Mensaje.getMensaje("LOGIN_PANEL-USUARIO"));
        claveLabel = new JLabel(Mensaje.getMensaje("LOGIN_PANEL-CLAVE"));
        usuarioTextField = new JTextField();
        usuarioTextField = new JTextField();
        clavePasswordField = new JPasswordField();
        guardarDatosCheckBox = new JCheckBox(Mensaje.getMensaje("LOGIN_PANEL-GUARDAR_DATOS"));
        guardarDatosCheckBox.setSelected(true);
        
        GroupLayout layout = new GroupLayout(this);
        setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup()
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup()
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                                .addGroup(layout.createSequentialGroup()
                                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                                        .addComponent(usuarioLabel, GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
                                        .addComponent(claveLabel, GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE))
                                    .addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
                                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                                        .addComponent(usuarioTextField, GroupLayout.DEFAULT_SIZE, 170, Short.MAX_VALUE)
                                        .addComponent(clavePasswordField, GroupLayout.DEFAULT_SIZE, 170, Short.MAX_VALUE)))
                                .addComponent(guardarDatosCheckBox, GroupLayout.DEFAULT_SIZE, 280, Short.MAX_VALUE)))
                        .addGroup(layout.createSequentialGroup()
                            .addGap(98, 98, 98)
                            .addComponent(getIniciarButton(), GroupLayout.PREFERRED_SIZE, 102, GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap(15, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup()
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                        .addComponent(usuarioLabel)
                        .addComponent(usuarioTextField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                        .addComponent(getClaveLabel())
                        .addComponent(clavePasswordField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(guardarDatosCheckBox)
                    .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(getIniciarButton())
                    .addContainerGap(13, Short.MAX_VALUE))
        );
    }
    
    private JLabel getClaveLabel() {
        if(claveLabel == null) {
            claveLabel = new JLabel(Mensaje.getMensaje("LOGIN_PANEL-CLAVE"));
        }
        
        return claveLabel;
    }
    
    protected JTextField getUsuarioTextField() {
        if(usuarioTextField == null) {
            usuarioTextField = new JTextField();
        }
        
        return usuarioTextField;
    }
    
    protected JPasswordField getClavePasswordField() {
        if(clavePasswordField == null) {
            clavePasswordField = new JPasswordField();
        }
        
        return clavePasswordField;
    }
    
    private JButton getIniciarButton() {
        if(iniciarButton == null) {
            iniciarButton = new JButton(Mensaje.getMensaje("LOGIN_PANEL-BOTON_INICIAR"));
            iniciarButton.addActionListener(new ActionListener() {
                
                @Override
                public void actionPerformed(ActionEvent e) {
                    iniciarSesion();
                }
            });
        }
        return iniciarButton;
    }
    
    protected JCheckBox getGuardarDatosCheckBox() {
        if(guardarDatosCheckBox == null) {
            guardarDatosCheckBox = new JCheckBox(Mensaje.getMensaje("LOGIN_PANEL-GUARDAR_DATOS"));
            guardarDatosCheckBox.setSelected(true);
        }
        
        return guardarDatosCheckBox;
    }

    private LoginPanelControlador getControlador() {
        if(controlador == null) {
            controlador = new LoginPanelControlador(this);
        }
        
        return controlador;
    }
    
    private void iniciarSesion() {
        if(validarDatos()) {
            try {
                if(getControlador().iniciarSesion()) {
                    firePropertyChange(IPropiedades.CERRAR_DIALOGO, true, false);
                }
                else {
                    DialogoMensaje.mostrarMensajeError(this, Mensaje.getMensaje("LOGIN_PANEL-ERROR_DATOS"));
                }
            }
            catch (IOException e) {
                DialogoMensaje.mostrarMensajeAdvertencia(this, Mensaje.getMensaje("LOGIN_PANEL-ERROR_DATOS"));
            }
        }
        else {
            DialogoMensaje.mostrarMensajeError(this, Mensaje.getMensaje("LOGIN_PANEL-ERROR_DATOS"));
        }
    }
    
    private boolean validarDatos() {
        return cadenaValida(getUsuarioTextField().getText()) && cadenaValida(getClavePasswordField().getPassword());
    }
}